Scroll to navigation

MKNOD(2) Linux Programmer's Manual MKNOD(2)

名前

mknod - 特殊ファイルや通常のファイルを作成する

書式

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int mknod(const char *pathname, mode_t mode, dev_t dev);


glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):

mknod(): _BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500

説明

システムコール mknod() は pathname という名前のファイルシステム・ノード (ファイル、デバイススペシャルファイル、名前付きパイプ) を、 属性 modedev の指定にしたがって作成する。

mode 引き数には、作成するノードの許可属性 (permission) とタイプを指定する。 mode の指定は以下にあげるファイルタイプのうちの 1 つと、 許可属性の組合せ (ビットごとの OR を使用) で行う。

許可属性は通常通り、プロセスの umask によって修正され、作成されたノードの許可属性は (mode & ~umask) となる。

ファイルタイプには S_IFREG, S_IFCHR, S_IFBLK, S_IFIFO, S_IFSOCK のいずれかを指定しなければならない。 それぞれ順に、通常のファイル (空のファイルとして作成される)・ キャラクタスペシャルファイル・ブロックスペシャルファイル・ FIFO (名前付きパイプ)・Unix ドメインソケットである (ファイルタイプ 0 は S_IFREG と同じである)。

ファイルタイプが S_IFCHR または S_IFBLK のとき、 dev には作成するデバイススペシャルファイルのメジャー番号と マイナー番号を指定する (makedev(3)dev のこれらの番号を作成する際に役立つだろう)。 それ以外の場合は dev は無視される。

pathname が既に存在する場合、またはシンボリックリンクの場合、 この呼び出しは EEXIST エラーで失敗する。

新しく作成されたノードの所有者はプロセスの実効ユーザ ID にセットされる。 新たに作られたノードを保持する 親ディレクトリの set-group-ID ビットがセットされていたり、 ファイルシステムが BSD のグループセマンティクスにしたがって マウントされている場合には、新しいノードのグループ所有権は親ディレクトリの グループ所有権を継承する (親ディレクトリと同じになる)。 また、そうでなかった場合の所有グループはプロセスの実効グループ ID となる。

返り値

mknod() は成功した場合 0 を、失敗した場合 -1 を返す (失敗した場合 errno がエラーの内容にしたがってセットされる)。

エラー

プロセスが親ディレクトリへの書き込み許可を持たない。 もしくはパス名 pathname 中のディレクトリ部分のどれかに検索許可属性が無い (path_resolution(7) も参照すること)。
pathname が既に存在する。 これには pathname がシンボリック・リンクである場合も含まれる (シンボリック・リンクが壊れているか (dangling) どうかは関係ない)。
pathname がそのプロセスのアクセス可能なアドレス空間の外を指している。
mode が通常のファイル・デバイススペシャルファイル・FIFO・ソケット以外を 作成するようにセットされている。
パス名 pathname を解決するときに、含まれているシンボリックリンクが多すぎた。
pathname が長過ぎる。
pathname 中で指定されているディレクトリが存在しないか、 またはリンク先の無いシンボリックリンクである。
十分なカーネルメモリが無い。
pathname のあるデバイスに新たにノードを作成する空きが無い。
pathname 中のディレクトリ要素が、実際にはディレクトリでない。
mode は通常のファイル・FIFO (名前付きパイプ)・Unix ドメインソケット以外を 作成するようにセットされているが、実行者が特権 (Linux では CAP_MKNOD ケーパビリティ (capability)) を持っていない。 または pathname を保持するファイルシステムが、指定されたノード形式をサポートしていない。
pathname が読み出し専用ファイルシステム上のファイルを指している。

準拠

SVr4, 4.4BSD, POSIX.1-2001 (下記も参照).

注意

POSIX.1-2001 では次のように書いている: 「mknod() の唯一の移植性のある使用法は、FIFO スペシャルファイルを作成することである。 modeS_IFIFO ではない場合、または dev が 0 ではない場合、 mknod() の挙動は規定されていない。」 しかしながら、現在ではこの目的のために mknod() を使用すべきではない。この目的のために特別に定義された関数である mkfifo() を使用すべきである。

Linux では、ディレクトリを作成するために この呼び出しを使用することはできない。 ディレクトリは mkdir(2) で作成すべきである。

NFS を実現しているプロトコルには多くの不備が存在し、 それらのいくつかは mknod() に影響を与える。

関連項目

chmod(2), chown(2), fcntl(2), mkdir(2), mknodat(2), mount(2), socket(2), stat(2), umask(2), unlink(2), makedev(3), mkfifo(3), path_resolution(7)

2008-12-01 Linux